/**
 *
 * 闭包实现私有属性
 * 该属性不会被枚举，不会被JSON.stringify显示出
 *
 */

function Person(){
    // private
    const this$ = {}

    class Person{
        constructor(name,age){
            this$.name = name
            this$.age = age
            this.notPrivate = 'notPrivate'
        }
        get name(){
            return this$.name
        }
        set name(name){
            this$.name = name
        }
    }

    // 重新设置原型链指向
    //Object -> Outer Person -> Inner Person Prototype -> Inner Person
    const instance = new Person(...arguments);
    Object.setPrototypeOf(Object.getPrototypeOf(instance), this);
    return instance
}

const p1 = new Person('王昭君',20)
console.log(p1 instanceof Person) //true
console.log(p1.name) // 王昭君
p1.name = '安琪拉'
console.log(p1.name)  // 安琪拉
console.log(p1.age)  // undefined
for (const key in p1) {           // 私有属性不会被枚举
    console.log(key+'...');  // notPrivate...
}
// JSON.stringify也不显示出私有属性
console.log(JSON.stringify(p1)); // {"notPrivate":"notPrivate"}